Hu3sky's blog

CVE-2020-2555 漏洞分析

Word count: 689 / Reading time: 3 min
2020/03/08 Share

漏洞背景

2020年3月6日,Oracle Coherence 反序列化远程代码执行漏洞(CVE-2020-2555)的细节被公开,Oracle Coherence为Oracle融合中间件中的产品,在WebLogic 12c及以上版本中默认集成到WebLogic安装包中,攻击者通过t3协议发送构造的序列化数据,能过造成命令执行的效果

image

影响版本

  • Oracle Coherence 3.7.1.17

  • Oracle Coherence 12.1.3.0.0

  • Oracle Coherence 12.2.1.3.0

  • Oracle Coherence 12.2.1.4.0

漏洞分析

gadget分析-链1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Gadget chain:
ObjectInputStream.readObject()
BadAttributeValueExpException.readObject()
LimitFilter.toString()
ChainedExtractor.extract()
ReflectionExtractor.extract()
Method.invoke()
Class.getMethod()
ReflectionExtractor.extract()
Method.invoke()
Runtime.getRuntime()
ReflectionExtractor.extract()
Method.invoke()
Runtime.exec()

官方修补了LimitFilter.toString(),该方法如下
image
主要关注我标记了的地方,如果m_comparator属性是ValueExtractor的实例,那么就会去调用extract方法,并且传入m_oAnchorTop属性,这里我们就需要明确最终的目的,造成命令执行,比较理想的就是能够调用Method.invoke(),通过反射调用任意方法,通过寻找,发现了com.tangosol.util.extractor.ReflectionExtractor类,该类可被序列化
image
我们看到他的extract方法,调用了method.invoke,两个参数都为序列化中的可控变量
image
不过我们知道,单凭这一个method.invoke是没法调用到Runtime.getRuntime().exec()的,需要再去寻找一个中间点去反复调用这个方法,这里就十分的类似Commons Collectionsgadgets,那么这个中间点就是com.tangosol.util.extractor.ChainedExtractor方法,他的extract方法
image
这样就能够将一整个反射给连接起来了,通过反射来造成java.lang.Runtime.getRuntime().exec的效果

那么回到最开始,我们还没有说怎么去调用LimitFilter.toString()方法,看到BadAttributeValueExpException重写的readObject方法,这里的readObjectvalObj变量是我们可控的,在进行反序列化时,java会调用ObjectInputStream类的readObject()方法。如果被反序列化的类重写了readObject方法,那么该类在进行反序列化时,Java会优先调用重写的readObject方法

类似的gadgets也出现在CommonsCollections5里,

image

链2-by @Lucifaer

基于某表达式语言的执行,比公开的第一条链简单,不需要用到多次反射
image

漏洞利用

通过t3协议将反序列化数据发送给weblogic server
image

修复建议

升级补丁,参考oracle官网发布的补丁https://www.oracle.com/security-alerts/cpujan2020.html 如果不依赖T3协议进行JVM通信,禁用T3协议。

进入WebLogic控制台,在base_domain配置页面中,进入安全选项卡页面,点击筛选器,配置筛选器。 在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,在连接筛选器规则框中输入 7001 deny t3 t3s 保存生效(需重启)

CATALOG
  1. 1. 漏洞背景
  2. 2. 影响版本
  3. 3. 漏洞分析
    1. 3.1. gadget分析-链1
    2. 3.2. 链2-by @Lucifaer
    3. 3.3. 漏洞利用
  4. 4. 修复建议